;
(function($){
    $.fn.jqV = function(pin){
        if (typeof pin == 'string') {
            var fn = $.jqInvoke.getAccessor($.jqValidator, pin);
            if (!fn) {
                alert("$.jqValidator - 未找到匹配的校验方法 : " + pin);
                //throw ("$.jqValidator - No such method: " + pin);
                return;
            }
            var args = $.makeArray(arguments).slice(1);
            return fn.apply(this, args);
        }
        return this.each(function(){
        
        });
    };
    
    /**
     * 校验器
     */
    $.jqValidator = $.jqValidator || {};
    $.extend($.jqValidator, {
        validateMsgKey: "validateMsg",
        validatePromptDivKey: "validateInfoDivId",
        /**
         * 校验表单
         */
        validateForm: function(selector){
            var state ={ bol:true, foscusElm:false};
            $(selector).find('input,select,textarea').each(function(ind, elm){
             	$.jqValidator.validateControl(elm, state);
            });
            return state.bol;
        },
		
		validateControl: function(obj, state, foucs){
			var $elm = $(obj), _val = "";
			_val = $elm.val();
			state = state || {bol:true, foscusElm:false};
			
			if(foucs === undefined) foucs = true;
			var validateRulesText = $elm.attr('validateRules');
			if (validateRulesText) {
				var validateRules = $.parseJSON(validateRulesText);
				if (!$.isEmptyObject(validateRules) && $.isPlainObject(validateRules)) {
					for (var key in validateRules) {
						if (!state.bol) {
							$elm.jqV(key, validateRules, _val);
						}
						else {
							state.bol = $elm.jqV(key, validateRules, _val);
						}
						if (!state.bol) {
							if (!state.foscusElm) {
								if(foucs)	$elm.focus();
								$.jqValidator.toggleValidateClass($elm, true);
							}
							state.foscusElm = true;
						}
					}
				}
			}
			
			return state.bol;
		},
        /**
         * 初始化规则
         */
        initValidateRules: function(selector){
            var $form = $(selector);
            //判断是否已经初始化
            if (!$form.data("alreadyInitValidateRules") == "true" || !$form.data("alreadyInitValidateRules") === true) {
                //已经初始化
                $form.data("alreadyInitValidateRules", true);
				
                $form.find('input,select,textarea').each(function(ind, elm){
                    var $elm = $(elm);
                    var validateRulesText = $elm.attr('validateRules');
                    if (validateRulesText && validateRulesText.length > 0) {
                        //创建提示Div
                        $.jqValidator.createValidatePrompt($elm);
                        
                        var validateRules = $.parseJSON(validateRulesText);
                        if (!$.isEmptyObject(validateRules) && $.isPlainObject(validateRules)) {
                            //1.校验规则初始化
                            for (var key in validateRules) {
                                if (key != "fieldName") 
                                    $elm.jqV("init_" + key, validateRules);
                            }
                            
                            //4.执行验证操作
                            var validateHandle = function(e){
                                var $this = $($.EventUtils.getTargetByEvent(e));
                                
                                var validateMsg = "", _val = "";
                                _val = $this.val();
                                
                                //取到当前控件的校验规则
                                var _validateRules = $.parseJSON($this.attr('validateRules'));
                                if ($.isEmptyObject(_validateRules) || !$.isPlainObject(_validateRules)) {
                                    return;
                                }
                                
                                for (var key in _validateRules) {
                                    //4.1.逐个规则进行验证
                                    if (key != "fieldName") {
                                        if (!$this.jqV(key, _validateRules, _val)) {
                                            //4.1.1.并且累加验证信息(show=false 的信息将不被追加)
                                            if ($this.data($.jqValidator.validateMsgKey)[key].show) {
                                                //4.1.2.追加验证信息
                                                validateMsg += $this.data($.jqValidator.validateMsgKey)[key].msg;
                                                validateMsg += ";</br>";
                                            }
                                        }
                                    }
                                }
                                //4.2.将所有不通过的验证  的提示信息存放到当前控件对象里
                                $this.data('errorValidateMsg', validateMsg);
                                if (validateMsg.length > 0) {
                                    //当前控件警告标识
									if(!$elm.is("select")) $.jqValidator.toggleValidateClass($this, true);
                                    if ($form.data("isShowValidateMsg") == "true" || $form.data("isShowValidateMsg") === true) {
                                        //显示验证信息
                                        $.jqValidator.showValidatePrompt($this);
                                    }
                                }
                                else {
                                    //去除验证信息
                                    $.jqValidator.hideValidatePrompt($this);
                                }
                            }
                            if ($elm.is("textarea") || $elm.is("input:text")) {
                                if ($.browser.msie) {
                                    $elm.bind('keyup focus', validateHandle);
                                }
                                else {
                                    elm.addEventListener('keyup', validateHandle, true);
                                    elm.addEventListener('focus', validateHandle, true);
                                //    elm.addEventListener('blur', validateHandle, true);
                                }
                            }
                            //3.针对下拉框的事件追加
                            else 
                                if ($elm.is("select")) {
                                    if ($.browser.msie) {
                                        $elm.bind('change focus', validateHandle);
                                    }
                                    else {
                                        elm.addEventListener('change', validateHandle, true);
                                        elm.addEventListener('focus', validateHandle, true);
                                    }
                                }
                        }
                    }
                });
            }
        },
        /**
         * 显示 表单控件的所有 消息提示,并显示警告标识
         */
        showValidatePrompt4Form: function(formSelector){
            var $form = $(formSelector);
            $form.find('input,select,textarea').each(function(ind, elm){
                var $elm = $(elm);
                $.jqValidator.showValidatePrompt($elm);
            });
        },
        /**
         * 关闭单个控件的 消息提示、并去除警告标识
         */
        showValidatePrompt: function($elm){
            //获取当前控件的验证信息提示Div
            var $validateInfoDiv = $('#' + $elm.data($.jqValidator.validatePromptDivKey));
            //重新给 信息提示Div 定位
            $validateInfoDiv.css({
                'left': $elm.offset().left + $elm.width() + 4
            });
            $validateInfoDiv.css({
                'top': $elm.offset().top
            });
            $validateInfoDiv.css({
                'position': 'absolute'
            });
            //获取当前控件 不能通过验证的信息
            var errorValidateMsg = $elm.data("errorValidateMsg");
            if (!$.StringUtils.isEmpty(errorValidateMsg)) {
                //信息提示Div 的内容
                var msgHtml = '<em><span class="pointer">&nbsp;</span>' + errorValidateMsg + '</em>'
                $.jqValidator.toggleValidateInfoDivClass($elm, true).show().html(msgHtml);
            }
            else {
                $.jqValidator.toggleValidateInfoDivClass($elm, false).hide();
            }
        },
        /**
         * 关闭表单的所有 消息提示、并去除警告标识
         */
        hideValidatePrompt4Form: function(formSelector){
            var $form = $(formSelector);
            $form.find('input,select,textarea').each(function(ind, elm){
                var $elm = $(elm);
                $.jqValidator.hideValidatePrompt($elm);
            });
        },
        /**
         * 关闭单个控件的 消息提示、并去除警告标识
         */
        hideValidatePrompt: function($elm){
            //获取当前控件的验证信息提示Div
            var $validateInfoDiv = $('#' + $elm.data($.jqValidator.validatePromptDivKey));
            $.jqValidator.toggleValidateInfoDivClass($elm, false).hide();
            //2.去除警告标识
            $.jqValidator.toggleValidateClass($elm, false);
        },
        /**
         * 切换验证样式
         */
        toggleValidateClass: function($elm, flag){
            if (!$elm.hasClass("validatebox-invalid") && flag) {
                $elm.addClass("validatebox-invalid");
            }
            else 
                if ($elm.hasClass("validatebox-invalid") && !flag) {
                    $elm.removeClass("validatebox-invalid")
                }
        },
        /**
         * 切换验证信息提示Div样式
         */
        toggleValidateInfoDivClass: function($elm, flag){
            //获取到验证提示Div ID
            $validateInfoDiv = $('#' + $elm.data($.jqValidator.validatePromptDivKey));
            if (flag === true) {
                $validateInfoDiv.addClass("prompt");
                $validateInfoDiv.removeClass("unprompt");
            }
            else {
                $validateInfoDiv.addClass("unprompt");
                $validateInfoDiv.removeClass("prompt");
            }
            return $validateInfoDiv;
        },
        /**
         * 创建 验证提示信息
         */
        createValidatePrompt: function($target){
            var target = $target[0];
            var $validateInfoDiv;
            if ($target.data($.jqValidator.validatePromptDivKey)) {
                //获取到验证提示Div ID
                $validateInfoDiv = $('#' + $target.data($.jqValidator.validatePromptDivKey));
            }
            else {
                //验证提示Div ID
                var validateInfoDivId = $target.attr("id") + "ValidateDiv";
                $target.data($.jqValidator.validatePromptDivKey, validateInfoDivId);
                
                //创建验证提示Div对象
                $validateInfoDiv = $(document.createElement("div"));
                $validateInfoDiv.attr("id", validateInfoDivId);
                
                //验证提示DivID存到当前控件上
                $target.data($.jqValidator.validatePromptDivKey, validateInfoDivId);
                
                $validateInfoDiv.addClass('prompt');
                //$validateInfoDiv.css({
                //    'width': 30
                //});
                $(document.body).append($validateInfoDiv);
            }
            
            if ($.browser.msie) {
                $(target).bind('mouseout mouseover blur', hideInfoDivFunc);
            }
            else {
                target.addEventListener('mouseout', hideInfoDivFunc, true);
                target.addEventListener('blur', hideInfoDivFunc, true);
                target.addEventListener('mouseover', showInfoDivFunc, true);
            }
            
            function hideInfoDivFunc(e){
                $elm = $($.EventUtils.getTargetByEvent(e));
                //获取当前控件的验证信息提示Div
                var $validateInfoDiv = $('#' + $elm.data($.jqValidator.validatePromptDivKey));
                $.jqValidator.toggleValidateInfoDivClass($elm, false).hide();
            }
            function showInfoDivFunc(e){
                //获取当前控件
                $elm = $($.EventUtils.getTargetByEvent(e));
                //获取当前控件的验证信息提示Div
                var $validateInfoDiv = $('#' + $elm.data($.jqValidator.validatePromptDivKey));
                //重新给 信息提示Div 定位
                $validateInfoDiv.css({
                    'left': $elm.offset().left + $elm.width() - 15
                });
                $validateInfoDiv.css({
                    'top': $elm.offset().top
                });
                $validateInfoDiv.css({
                    'position': 'absolute'
                });
                //获取当前控件 不能通过验证的信息
                var errorValidateMsg = $elm.data("errorValidateMsg");
                if (!$.StringUtils.isEmpty(errorValidateMsg)) {
                    //信息提示Div 的内容
                    var msgHtml = '<em><span class="pointer"></span>' + errorValidateMsg + '</em>'
                    $.jqValidator.toggleValidateInfoDivClass($elm, true).show().html(msgHtml);
                }
                else {
                    $.jqValidator.toggleValidateInfoDivClass($elm, false).hide();
                }
            }
        },
        
        setIsShowValidateMsg: function(selector, bol){
            var $form = $(selector);
            $form.data("isShowValidateMsg", bol);
        }
    });
})(jQuery);
